package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(3,5));
        list.add(new Point(68,98));
        list.add(new Point(12,37));
        list.add(new Point(65,2));
        list.add(new Point(42,8));
        System.out.println(list);
        /*
            sort方法要求集合元素必须实现:Comparable接口,否则编译不通过
            compare:比较

            注意:
            当我们使用sort方法对集合排序时,如果该集合要求元素必须实现Comparable接口,而该元素
            没有实现时,则不再使用该sort方法.
            原因:
            因为该方法对我们的代码具有侵入性

            侵入性:
            当我们使用某个API功能时,该功能要求我们为其修改额外代码,那么这种现象就称为侵入性.
            侵入性不利于后期代码维护,应当尽量避免.


         */
//        Collections.sort(list);
        //实例化一个比较器
//        MyComparator comparator = new MyComparator();
//        Collections.sort(list,comparator);




        //使用匿名内部类形式创建比较规则
//        Comparator<Point> comparator = new Comparator<Point>() {
//            public int compare(Point o1, Point o2) {
//                int olen1 = o1.getX()*o1.getX()+o1.getY()* o1.getY();
//                int olen2 = o2.getX()*o2.getX()+o2.getY()* o2.getY();
//                return olen1-olen2;
//            }
//        };
        /*
            sort方法内部会自行使用comparator这个比较器的compare方法对集合元素两两比较,然后
            按照从小到大排序集合
         */
//        Collections.sort(list,comparator);






        Collections.sort(list,new Comparator<Point>() {
            public int compare(Point o1, Point o2) {
                int olen1 = o1.getX()*o1.getX()+o1.getY()* o1.getY();
                int olen2 = o2.getX()*o2.getX()+o2.getY()* o2.getY();
                return olen1-olen2;
            }
        });


        System.out.println(list);

    }
}

/*class MyComparator implements Comparator<Point>{

    @Override
    *//**
     *  compare方法用于定义o1与o2的大小关系.
     *  返回值:
     *  当返回值>0时,表示o1>o2
     *  当返回值<0时,表示o1<o2
     *  当返回值=0时,表示o1=o2
     *//*
    public int compare(Point o1, Point o2) {
        //计算o1点到原点的距离
        int olen1 = o1.getX()*o1.getX()+o1.getY()* o1.getY();
        //计算o2点到原点的距离
        int olen2 = o2.getX()*o2.getX()+o2.getY()* o2.getY();
        return olen1-olen2;
    }
}*/
